Проектная работа "Анализ товарного ассортимента"

Выполнил: Киселев Дмитрий

Задача:

В интернет-магазине для дома быта требуется провести аналитику ассортимента и дать рекомендации заказчику по повышению эффективности бизнеса. Заказчик предоставляет данные о транзакциях за определенный период без мастер-данных. Для их анализа потребуется задать верную категоризацию продуктов, определить тренды в покупках и сформулировать и проверить гипотезы, связанные с количеством продаж или выручкой.

План проведения работы:

Описание данных

Датасет описывает транзакции интернет-магазина товаров для дома и быта.

Колонки в ecommerce_dataset.csv :

Оглавление

  1. Открытие, изучение данных
  2. Предобработка, форматирование, удаление дубликатов и аномалий
  3. Категоризация
  4. Анализ данных, поиск закономерностей
  5. Проверка гипотез и выводы
  6. Приложения, материалы

Дашборд

доступен на ресурсе PublicTableau по публичному адресу: https://public.tableau.com/views/product_analysis_project/Dashboard1?:language=en-US&:display_count=n&:origin=viz_share_link

Содержание и элементы управления

  1. Диаграмма, отображающую сумму покупок по дням
  2. Гистограмма, отображающую распределение заказов по сумме
  3. Фильтр по дате совершения покупки, выбору категории

Презентация в формате pdf https://disk.yandex.ru/i/U5eRylyLihrH0A

Шаг 1. Открытие файла с данными и изучение общей информации

В выгрузке 6737 записи, пропусков нет, транзакции разбиты на уровне позиции в заказе. Временной период 00 часов 1 октября 2018г - 16 часов 31 октября 2019 года, всего 13 полных месяцев,учтем это. Следует задать корректные типы данных в колонках date, order_id. Наименования колонок корректны, для верного избрания категорий придется изучить состав продуктов, похоже преимущественно это растения. Также в таблицу нужно добавить поля выручки (price*quantity), номер часа, номер дня недели, номер месяца и выделить ключевые слова в названии продукта. Перед этим попробуем изучить скрытые дубликаты в номерах заказов или клиентов, аномалии в распределениях или значениях.

Шаг 2. Предобработка данных

Существуют пользователи которые генерируют много разных заказов за одни сутки, но судя по статистике это скорее лояльные покупатели. Имеется проблема дублирования записей заказов, это может быть баг записи данных, самого сервиса или отсутствующие параметры статуса заказа из выгрузки. Видно, что в худшем случае 1 заказ, состоящий из 12 позиций единственного уникального пользователя повторяется 74 раза. Удалим дубликаты с повторными заказами у одних и тех же пользователей по одним и тем же продуктам. Оставим самые поздние записи по дате - такие заказы будут считаться верными и исполнеными.

Это довольно существенный изъян выгрузки - реальное количество записей сокращено на 1886 (~ -28%), однако он имеет техническую природу. Поэтому дальнейшую фильтрацию будем замерять к числу записей - 4851.

Даже с "двумя октябрями" в данных преобладают записи с апреля по май - выражена сильная пиковая сезонность. Количество преимущественно до двухсот. Цены в основном до 3000. Просадка в распредлении записей по датам - август, сентябрь. В течении дня покупки совершаются неравномерно: примерно в 1.8 раза чаще (+80%) с 7.00 до 15.00 чем с 15.00 до 00.00

Среднее значение количества для позиции 2,8; изучим аномальные значения за пределами трех стандартных отклонений. Аналогично, для цены среднее значение - 516, аномальные значений за пределами трех сигм (вероятность 99,72%) также ярко выражено. Изучим записи с quantity > 86 и price > 6846. Но нам пока неизвестно как эти дорогие и многочисленные покупки влияют на общий доход. Дело в том, что если бизнес невелик, а продажи относительно нестабильны и случаются нетипичные крупные заказы или редкие дорогие заказы, это может быть существенно для бизнеса. Замерим долю выручки каждой аномалии относительно общей выручки.

Для аномалий в количестве эффект крайне велик - кусок в 19,1% выручки. Взглянем на такие продукты и заказы поближе, кроме этого будет полезно зафиксировать группу многочисленных товаров отдельно - они могут выделяться логистическими особенностями, наверняка размером, и иметь большое влияние на затраты. Зафиксируем списки продуктов для предстоящей категоризации, они могут пригодиться (в меньшей степени по ценам в данном случае, эффект ~ 3% на выручку).

Показательно что это всего 13-14 покупателей из 2451 уникальных. Для небольшого бизнеса возможность ухватиться за платящих клиентов и расширить ассортимент этих категорий может иметь высокую эффективность. Или например выйти на оптовые объемы и клиентов B2B. Пока запомним множество наименований (rare_goodsIHI - rare goods IncomeHighlyImpacted) для (quantity > @sigma3_quantity) как потенциальные точки роста магазина с долей 19.1% в выручке.

Несмотря на большой эффект в выручке, данные записи будут иметь негативный эффект на предстоящий статистический анализ. Их количество совсем невелико (14 записей) и теперь мы вернемся к ним отдельно в блоке выводов. Заменим рабочий датасет df и далее продолжим анализ.

Ассортимент достаточно пестрый, попробуем задать уникальную категоризацию с учетом популярности у покупателей.

Шаг 3. Категоризация ассортимента

Метод полного соответствия словарю через парсинг интернет каталогов на сайтах затруднен из-за неоднородности состава наименований у нашего магазина. Устройство современных сайтов - торговых площадок затрудняют сбор данных особенно по множественным категориям, а некоторые намеренно его ограничивают. Принято решение создать специальный алгоритм с использованием библиотеки для лематизации текста, основываясь на двух ключах в полном наименовании товара. Он должен помочь установить объекты из текста.

Будем использовать pymystem3 (A Python wrapper of the Yandex Mystem 3.1 morphological analyzer). Библиотека позволит распознать части речи и лемматизировать слова (привести к изначальной форме, пример "шёл"-"идти"). Так мы получим возможность решить задачу категоризации неупорядоченных данных (для нас - названия продукта) через минимизацию количества объектов в исходных названиях и установлении их популярности в датасете.

Можно принять, что на любом языке объектом данных/информации выступают слова, которые группируются по частям речи. Имена существительные часто сами объекты, а прилагательные - их характеристики. Тогда для задачи категоризации множества наименований будет уместно использовать на них упорядоченный фильтр в логике: лучше всего объект описывает имя существительное, остальные части речи - уточняющие атрибуты объекта. Получается, лучшие комбинации частей речи 2ух ключей названия товара в русском языке это сущ. + сущ.; сущ. + прил.; прил. + сущ.. Остальные сочетания имееют более низкую ценность для определения общих объектов в названиях.

Реализуем задумку с помощью функции, которая примет наш датасет с заготовленными ключами наименования продуктов key_word1 и key_word2

Типично для русского языка - на первом месте больше всего существительных (381 слово из 460), далее - описательная часть(либо тоже существительное, с близкой вероятностью прилагательное. Теперь можно собрать категории - для этого сначала определим объекты наименований со всеми уникальными комбинацииями сущ. в обоих ключах. Объединение в категории произведем по популярности и доле выручки объектов.

Для удобства обернем слияние словарей, обработку и сортировку датафрейма в функцию, которая принимала бы датасет и исходные словари, а на выходе отдавала датафрейм с готовыми категориями.

В нашем датасете множество нарицательных наименований растений, обогатим данные наших словарей названиями из открытого доступа в справочнике растений сайта Global Flowers. ( https://global.flowers/plants/?title-index=local ). Это позволит избежать временных затрат на парсинг сайта, который в разы больше чем простое копирование целого алфавитного справочника (в локальном файле они собраны в txt одной строкой, выложены на yadisk - https://disk.yandex.ru/d/WtTBRKXYobec0w ). Совпадение названий цветков или слово "растение" в названии должно объявлять категорию "растения" и так далее по коду ниже.

Получилось 7 категорий, самая крупная по доле выручки - "бытовые товары", самая многочисленная по заказам - "растения". Достаточно большие и явно выделяющиеся от остальных - "сумки/тележки", "сушилки". Самые маленькие по выручке, но также с большим количеством товара - "рассада" и "муляжи". В категорию "прочие" попали все редкие по продажам товары с долей в совокупной выручке < 17%

Выше на графике представлены категории в размерах относительно принесенной выручки за весь период. Теперь перейдем к динамике и качественному анализу категорий.

Шаг 4. Анализ и поиск закономерностей

Проведем abc анализ датасета в группировке по изначальному наименованию и критерию доходности income. Так как у нас нет данных о себестоимости, нет смысла множить критерии дополнительными признаками (для двух получится уже 9 категорий). И даже оценивая доходную часть, минимизируя тем самым риск ошибки ложных выводов в условиях ограниченных данных, abc анализ не способен проигнорировать ошибки рода: товара нет на складе, временный ассортимент, промо и тд. Нам понадобится простая и удобная библиотека abc_analysis - она исключает рутинную работу с табличками при использовании метода анализа и адаптирована к работе с pandas. Границы % можно вывести на график, они вычисляются статистически.

Принимая допущения, по итогу попробуем выделить наглядно очаги "выгодных товаров" в разбивке категорий, заданных ранее. Помним, что редкие товары с высоким влиянием на доход изначально изолированы в отдельный датасет (rare_goodsIHI - rare goods IncomeHighlyImpacted). Разделение позволяет оценивать актуальный ассортимент, избегая влияния на среднюю выручку.

Граница группы A статистически обычно определяется ~ в районе 80% эффекта анализируемого критерия (поэтому анализ еще называют Парето, но границы категорий также можно задавать экспертно). Как видим из графика и распределения у нас 560 товаров группы А, 248 - B и 1527 - C. Т е всего 24% ассортимента формируют примерно 78% дохода. Главная ценность этого вывода в понимании доли группы А - она приблизительная, т к у нас данные за 13 месяцев. Если предприятие часто ротирует ассортиментную матрицу, то следует фильтровать датасет по времени, примем и это допущение.

Теперь построим heatmap по по количеству заказов в осях двух категорий. Так мы поймем сильные и слабые стороны ассортимента интернет-магазина по доходности.

Заметно, что количество заказов товара категории С избыточно - такие товары генерируют лишь 12-13% общей выручки и занимают 65% ассортимента. В первую очередь это касается ассортимента растений, почти всего из рассады, муляжей и прочих (низкооборачиваемые товары). Хотя в последнем все еще можно отыскать полезные для покупателей и доходные для бизнеса позиции группы A. Ассортимент бытовых товаров также изобилует группой С. Лучше всего дела обстоят для сушилок и сумок-тележек. Возможно руководству следует углубиться в анализ и сделать зачистку ассортимента в бытовых товарах, также подумать над логистикой и затратами для муляжей, рассады, отказаться от части растений если это поможет структурно оздоровить PnL компании.

Изучим динамику продаж во времени в разрезе категорий, чтобы определить тренды и дополнить рекомендации. Возьмем весь доступный период 13 месяцев - так сможем сравнить продажи октября год к году.

На графиках выше заметно, что существуют очевидная сезонность по году для рассады (апрель/май 27-33 % продаж, не выше 11% в остальной период), пиковый интерес к растениям ( в марте ~ 44% всех проданых товаров, в июне 37%). Спрос на сумки тележки и сушилки стабильно невысокий, но приносящий относительно крупный доход. Он частично компенсирует общее падение доходов (-33% к месяцу прошлого года) на фоне совокупного снижения продаж в количестве (-38% к месяцу прошлого года). По большей части это происходит из-за доли бытовой техники - за год она сократилась более чем в два раза в продажах и выручке. В октябре падение доходов здесь замедлилось - возможно это большая доля ассортимента A или просто рост цен, т к продажи продолжают сокращаться. Конечно для бытовых товаров характерна сезонность зимой перед новым годом, однако тренд на годовом фрейме пока выглядит плохо. У растений также не вполне здоровая динамика - продажи в штуках растут месяц к месяцу прошлого года на 29%, но доход меньше на 15%. Еще один повод заняться категорией также в первую очередь.

В целом по совокупности выводов следует, что магазину следует резать издержки, сокращая неприносящий доход ассортимент. Сэкономленные деньги можно запускать на усиление категорий растения, мероприятия нацеленные на улучшение unit экономики в каждой категории.

Шаг 5. Проверка гипотез и выводы

Исходя из особенностей динамики продаж, будет важным обнаружить статистическую значимость в изменении доходности главных продуктов. На данный момент в приоритете остановить падение категории бытовых товаров. Поэтому дополнительно изучим, насколько сильно сокращение категории повлияло на доходность товаров группы А по году. Так можно будет уточнить природу нисходящего тренда продаж бытовых товаров и сформировать дальнейшую продуктовую стратегию.

H_0: Выручка (income) от покупок (заказов) бытовых товаров категории А за 11.2018-04.2019 = Выручка (income) от покупок (заказов) бытовых товаров категории А за 05.2019-10.2019`
H_1: Выручка (income) от покупок (заказов) бытовых товаров категории А за 11.2018-04.2019 ≠ Выручка (income) от покупок (заказов) бытовых товаров категории А за 05.2019-10.2019`
alpha = 0.05

Разделим 13 месяцев на полугодия относительно даты 31.04.2019 (октябрь 2018 не берем в тест, чтобы использовать именно годовой срез), будем сравнивать два полугодия до 31.04.2019 и после. Для этого понадобится столбец с признаком H1 - (<2019-04-31), H2(>2019-04-31). Применим простую функцию к столбцу даты ниже и в этой разбивке также построим график распределения доходностей.

Из визуализации распределений напрашивается вывод что средняя выручка от продажи бытовой техникии категории А скорее не изменилась. Однако произошли неизвестные изменения влияющие на форму распределения в H2 - оно уже, и имеет более заметное смещение наверх по уровню доходности, это может быть связано с количеством в заказов выборках или заметным изменением характеристик объема или цены к прошлому полугодию. Проведем тест чтобы подтвердить или опровергнуть гипотезу. Для проверки гипотезы о равенстве средних двух генеральных совокупностей для зависимых (парных) выборок в Python, применим метод scipy.stats.ttest_rel(). Т к данные однородны, будем считать что дисперсия одинакова, оставим одинаковое количество наблюдений через рандомную выборку для одного из срезов.

Данные не предоставляют достаточного основания отвергнуть нулевую гипотезу: p-value сильно превышает уровень значимости что в 5%, что даже в 10%). Значит, можно сделать вывод, что доходность (средняя выручка) одного заказа бытовой техникии категории А не изменилась несмотря на двойное дохода общей категории. Это исключает фактор цены для товара категории A, значит изменился спрос, возможно какие-то модели успели технически устареть? Напоследок можно проверить пересечение множества наименований товаров H1 и H2 из теста. Так можно вынести конкретные изменения в матрице для предметного обсуждения с руководством интернет магазина.

Кстати, при многочисленном запуске кода выше происходит случайная выборка 135 продаж из 255 для H1 (т к их было больше, а H2 = 135) — гораздо чаще мы получаем тот же результат: p-value сильно превышает пороги. Это подтверждает нормальность распределения данных в H1. При этом конечно увеличиваются риск ошибок первого и второго рода, но для наших размеров выборок можно считать результаты репрезентативными.

Количество SKU, выпавших из спроса бытовых товаров категории А в H2 SKU - 118. Чтобы не засорять эфир Jupiter, наверху выведены лишь объекты наименований. Получается, что одной из причин снижения выручки по категории бытовых товаров класса А являются исчезновение из спроса (или предложения) вешалок, веников, наборов ножей, простыней и наматрацников.

Итак, имеющийся набор данных позволяет ознакомится с ассортиментом интеренет магазина, подчеркнуть закономерности в динамике продаж, включая количественные характеристики. В ходе работы была задана уникальная категоризация по товарам, определены самые сильные продукты приносящие большую долю выручки. Тем самым в условиях падения продаж можно концентрировать усилия на важных для бизнеса участках. Однако полный вывод и рекомендацию об управлении ассортиментом следует делать на основе комплексной оценки вместе с прогнозом доходности, учетом затрат и обогощенной информации по клиентам и т д.

Общая рекомендация на основе анализа доходной части и динамики категорий - сконцентрироваться на выявлении сезонного товара в категории бытовых товаров, выводить из всего ассортимента непопулярные товары категорий B и С, сформулировать стратегию развития категорий растения. Также нужно уделить внимание развитию нишевых категорий сушилок и сумок/тележек, провести в них анализ клиентов. Решить необходимость заниматься муляжами и рассадой - товары многочисленны но не приносят сопостовимого дохода.

Самая крупная по доле выручки - "бытовые товары", самая многочисленная по заказам - "растения". Достаточно большие и явно выделяющиеся от остальных - "сумки/тележки", "сушилки", генерирующие стабильный доход. Самые маленькие по выручке, но также с большим количеством товара - "рассада" и "муляжи". В категорию "прочие" попали все редкие по продажам товары с долей в совокупной выручке < 17%.

При дальнейшем анализе важно определить область регулярного бизнеса. Важно обратить внимание на первичный состав данных - в нем содержатся скрытые дубликаты и очень редкие аномальные заказы. Так, был определен возможный источник дубликатов, а аномалии изначально изолированы с отдельной рекомендацией. Удаление аномальных товаров с большим количеством позволило получить значимые статистические выводы по регулярным заказам. Из-за высокого порога для отсечения удалось точно определить, что это не BAU заказы, их следует выносить на отдельное рассмотрение - шансы на получение таких заказов ~ 0.28%. Рекомендация - рассмотреть их адресно, и определить можно ли выделить такие товары или покупателей в раздел оптовой торговли с бизнесом/предпринимателями и уже там категоризировать.

Подводя итоги анализа можно разделить ассортимент в категориях "основной" и "дополнительный". К основным отнесем только крупные и перспективные категории по выручке(бытовые товары, сумки/тележки, растения, сушилки), из групп А, B. Все остальное попадет в дополнительный ассортимент - финально взглянем на характеристики в такой разбивке для подтверждение корректности и соблюдения Парето эффективности.

Шаг 6. Дополнительные материалы

Презентация заказчику pdf - https://disk.yandex.ru/i/U5eRylyLihrH0A

Публичный дашборд в Tableau - https://public.tableau.com/views/product_analysis_project/Dashboard1?:language=en-US&:display_count=n&:origin=viz_share_link